package com.skh.array;

import java.util.Arrays;

/**
 * @Author skh
 * @Date 2020/3/22 23:24
 * @Desc 使数组唯一的最小增量
 */
public class MinIncrementForUnique {
    /**
     * 给定整数数组 A，每次 move 操作将会选择任意 A[i]，并将其递增 1。
     *
     * 返回使 A 中的每个值都是唯一的最少操作次数。
     *
     * 示例 1:
     *
     * 输入：[1,2,2]
     * 输出：1
     * 解释：经过一次 move 操作，数组将变为 [1, 2, 3]。
     * 示例 2:
     *
     * 输入：[3,2,1,2,1,7]
     * 输出：6
     * 解释：经过 6 次 move 操作，数组将变为 [3, 4, 1, 2, 5, 7]。
     * 可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。
     */

    /*
    逻辑：先排序，再依次遍历数组元素，若当前元素小于等于它前一个元素，则将其变为前一个数+1。
     */
    public int minIncrementForUniqueminIncrementForUnique(int[] A) {
        Arrays.sort(A);
        int move = 0;
        for (int i = 1; i < A.length; i++) {
            if (A[i] <= A[i - 1]) {
                int temp = A[i];
                A[i] = A[i-1] +1;
                move += A[i]- temp;
            }
        }

        return move;
    }

    public static void main(String[] args) {
        MinIncrementForUnique minIncrementForUnique = new MinIncrementForUnique();
        int[] A = {3,2,1,2,1,7};
        int move = minIncrementForUnique.minIncrementForUniqueminIncrementForUnique(A);
        System.out.println("move = " + move);
    }
}


